import router, {adminRoutes, userRoutes} from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式
import { Message } from 'element-ui'
import { getToken } from '@/utils/auth' // 验权


import pathJudge from "@/utils/routerPathJudge";
import jwtDecode from "jwt-decode";
import Vue from "vue";
import fa from "element-ui/src/locale/lang/fa";
const whiteList = [
    '/login',
  '/index/index_2',
  '/index/index_1',
  '/test',
  '/ip',
  "/admin/login"
] // 不重定向白名单，就算访问这个的时候不会进行重定向
router.beforeEach((to, from, next) => {
  NProgress.start()
  /*用户每一次进入路由都得获取一次token*/
  if (getToken()!=null) {/*1.先检测token是否存在*/
    if (to.path === '/login') {//如果token存在，而且是想要进入登陆界面的话，得拦截用户，用户不需要再一次登陆
      /*这里需要判断用户身份，从而选择进入哪个路由或者主界面*/
      next({ path: '/' })
/*      注意next('/user')与next({path:'/user'})的效果不同*/
      NProgress.done() // if current page is dashboard will not trigger	afterEach hook, so manually handle it
    } else {
      /*当用户用户拥有token的时候，如果输入路由匹配不到的路径就会跳转到404页面*/
      let getters=store.getters;
      let roles=getters.roles
      if (roles==null) {
        store.dispatch('GetInfo',getToken()).then((test) => { // 拉取用户信息
          // console.log(store.getters.roles=='')
          next();
        }).catch((err) => {
          store.dispatch('FedLogOut').then(() => {
            Message.error(err || 'Verification failed, please login again')
            next({ path: '/' })
          })
        })
      } else {
        /*这一步非常关键*/
        next()
      }
    }

  } else {
   /* 注意一个小坑，如果遇到路由有重定向的话，这里会经过两次，例如一个/index页面会重定向到/index/index_2，那么浏览器第一次输入index
    会经过这里判断里面白名单存在，如何放行，放行之后会遇到路由重定向，因为你写的重定向，会再一次经过这里，但是这里没有index/index_2的白名单，
    所以会被拦截
    (这条记录作废，不是这么想的，以下观点会正确，可能正确吧）
    每次用户输入路径的时候，先执行的顺序是router.js->permission.js
    也就是说先由router.js判断，如果有重定向，会先执行重定向
    如果你的router.js里面写的是/index => /index/index_2
    会先重定向/index/index_2
    然后再进入beforeEach

    */
    // console.log(whiteList.indexOf(to.path))
    console.log(to.path)
    let res=pathJudge(whiteList,to.path);
    console.log(whiteList.indexOf(to.path)!==-1)
    if (res) {
      // console.log(to.path);
      next()
    } else {
      /*在JS中想要使用${}获取变量 要在 ` `中使用
      注意！！！ 是  `  ` （~的那个键） 不是 单引号！！！*/
/*      console.log(`${to.path}`)*/
      /*页面不存在时候会跳转到这里*/
      next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页,使用redirect可以证明该页面进行了重定向跳转
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done() // 结束Progress
})


/**
 * next():执行了to里面的路由对象,进行管道中的下一个钩子。如果全部钩子执行完了，则导航的状态就是 confirmed (确认的)。
 *
 *     1.不带参数:指向(进入)to钩子--进入下一个页面，但是不会触发beforeEach,但是这个不会触发beforeEach是对于当前路径而言，如果next（）执行完毕，遇到路由重定向（也就是路由匹配规则里面的重定向），会再一次进入beforeEeach
 *     2.带参数next('/')或者next({path:'/'}):进入指定页面,发生路由变化，有变化就会触发beforeEach ---  问题:容易造成死循环--比如next('/index'),当执行到这里的时候，触发beforeEach,又遇到里面的next('/index')，又触发next('/index')......
 *
 *     如果要进入下一个页面，直接next()--进入to钩子，调用to里面的路径，往下一个页面跑
 *
 *      console.log(to)  // 进入的页面(下一个页面)
 *      console.log(from) // 离开之前的页面(上一个页面)
 *      console.log(next) // next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。确保要调用 next 方法，否则钩子就不会被 resolved。
 *
 *      to.path:进入的下一个页面的路径
 *
 */

